/**
 * 
 */
package com.whf15.o2o.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.whf15.o2o.dto.ImageHolder;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

/**
 * @author 作者 :whfo
 * @version 创建时间：2021年4月30日 下午8:13:16 类说明
 */
public class ImageUtil {
	private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
	private static final SimpleDateFormat sDataDormat = new SimpleDateFormat("yyyMMddHHmmss");
	private static final Random r = new Random();
	static Logger logger = LoggerFactory.getLogger(ImageUtil.class);

	public static String generateThumbnail(ImageHolder thumbnail, String targetAddr) {
		String realFileName = getRandomFileName();
		String extension = getFileExtension(thumbnail.getImageName());
		makeDirPath(targetAddr);
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr"+relativeAddr);
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is:"+PathUtil.getImgBasePath()+relativeAddr);

		try {
			Thumbnails.of(thumbnail.getImage()).size(200,200)
			.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/logo.jpg")), 1f)
			.outputQuality(0.8f).toFile(dest);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return relativeAddr;
	}
	
	/**
	* 方法描述：   
	* 创建人：whfo   
	* 创建时间：2021年7月5日 下午11:25:43 
	* @param thumbnail
	* @param targetAddr
	* @return
	*/
	public static String generateNormalImg(ImageHolder thumbnail,String targetAddr) {
		//获取不重复的随机名
		String realFileName = getRandomFileName();
		//获取文件的扩展名如png，jpg等
		String extension = getFileExtension(thumbnail.getImageName());
		//如果目标路径不存在，则自动创建
		makeDirPath(targetAddr);
		//获取文件存储的相对路径（带文件名）
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr"+relativeAddr);
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is:"+PathUtil.getImgBasePath()+relativeAddr);
		//调用Thumbnails生成带有水印的图片
		try {
			Thumbnails.of(thumbnail.getImage()).size(337,640)
			.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/logo.jpg")), 1f)
			.outputQuality(0.9f).toFile(dest);
		} catch (IOException e) {
			logger.error(e.toString());
			throw new RuntimeException("创建略缩图片失败："+e.toString());
		}
		return relativeAddr;
		
	}

	/**
	 * 2021年4月30日
	 * 创建目标路径所涉及的目录，即/home/work/whf15/xxx.jpg,
	 * 那么 home work whf15 这三个文件夹都得自动创建
	 * @param targetAddr
	 */
	private static void makeDirPath(String targetAddr) {
		// TODO Auto-generated method stub
		String realFileParentPath = PathUtil.getImgBasePath()+targetAddr;
		File dirPath = new File(realFileParentPath);
		if(!dirPath.exists()) {
			dirPath.mkdirs();
		}
	}

	/**
	 * 2021年4月30日
	 * 获取输入文件流的扩展名
	 * @param thumbnail
	 * @return
	 */
	private static String getFileExtension(String fileName) {
		return fileName.substring(fileName.indexOf("."));
		
	}

	/**
	 * 2021年4月30日
	 * 生成随机文件名，当前年月日小时分秒钟+五位随机数
	 * @return
	 */
	public static String getRandomFileName() {
		// 获取随机的五位数
				int rannum = r.nextInt(89999) + 10000;
				String nowTimeStr = sDataDormat.format(new Date());
				return nowTimeStr+rannum;
	}

	public static void main(String[] args) throws Exception {
		Thumbnails.of(new File("C:/Users/whfo/Pictures/V0t91.jpg")).size(200, 200)
				.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/logo.jpg")), 1f)
				.outputQuality(0.8f).toFile("C:/Users/whfo/Pictures/new.jpg");
		System.out.println(basePath);
	}
	
	/**
	 *	storePath是文件的路径还是目录的路径
	 *	如果storePath是文件路径则删除该文件
	 *	如果storePath是目录路径则删除该目录下的所有文件
	 * */
	public static void deleteFileOrPath(String storePath) {
		File fileOrPath = new File(PathUtil.getImgBasePath()+storePath);
		if(fileOrPath.exists()) {
			if(fileOrPath.isDirectory()) {
				File files[] = fileOrPath.listFiles();
				for(int i=0;i<files.length;i++) {
					files[i].delete();
				}
			}
			fileOrPath.delete();
		}
	}
}
